`CPVT_Section` 类是 PDFium 项目中用于处理 PDF 文档中可变文本注释的段落布局和管理的关键类。它负责管理段落中的行和单词，并提供了一系列方法来添加、删除、重新排列以及查询段落中的内容。以下是该类的主要功能和方法概述：

### 公有成员

#### 内部类 `Line`

- **构造函数 `explicit Line(const CPVT_LineInfo & lineinfo)`* * :
-功能：创建一个 `Line` 实例，接收 `CPVT_LineInfo` 结构体来初始化行信息。

- **析构函数 `~Line()`* * :
-功能：释放 `Line` 占用的资源。

- **方法 `CPVT_WordPlace GetBeginWordPlace() const`* * :
-功能：返回该行的第一个单词的位置。

- **方法 `CPVT_WordPlace GetEndWordPlace() const`* * :
-功能：返回该行的最后一个单词的位置。

- **方法 `CPVT_WordPlace GetPrevWordPlace(const CPVT_WordPlace & place) const`* * :
-功能：返回该行中给定位置前一个单词的位置。

- **方法 `CPVT_WordPlace GetNextWordPlace(const CPVT_WordPlace & place) const`* * :
-功能：返回该行中给定位置后一个单词的位置。

- **成员变量 `CPVT_WordPlace m_LinePlace`* * :
-功能：存储该行的起始位置。

- **成员变量 `CPVT_LineInfo m_LineInfo`* * :
-功能：存储该行的信息，如行宽、行高、基线等。

#### 主类 `CPVT_Section`

- **构造函数 `explicit CPVT_Section(CPVT_VariableText * pVT)`* * :
-功能：创建一个 `CPVT_Section` 实例，接收指向 `CPVT_VariableText` 的指针。

- **析构函数 `~CPVT_Section()`* * :
-功能：释放 `CPVT_Section` 占用的资源。

- **方法 `void ResetLinePlace()`* * :
-功能：重置段落中的行位置。

- **方法 `CPVT_WordPlace AddWord(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo)`* * :
-功能：在指定位置插入一个新单词，并返回新单词的位置。

- **方法 `CPVT_WordPlace AddLine(const CPVT_LineInfo & lineinfo)`* * :
-功能：在段落中添加一行，并返回该行的起始位置。

- **方法 `void ClearWords(const CPVT_WordRange & PlaceRange)`* * :
-功能：清除指定范围内的所有单词。

- **方法 `void ClearWord(const CPVT_WordPlace & place)`* * :
-功能：清除指定位置的单词。

- **方法 `CPVT_FloatRect Rearrange()`* * :
-功能：重新排列段落中的所有内容，并返回新的矩形区域。

- **方法 `CFX_SizeF GetSectionSize(float fFontSize)`* * :
-功能：根据给定的字体大小计算段落的尺寸。

- **方法 `CPVT_WordPlace GetBeginWordPlace() const`* * :
-功能：返回段落的第一个单词的位置。

- **方法 `CPVT_WordPlace GetEndWordPlace() const`* * :
-功能：返回段落的最后一个单词的位置。

- **方法 `CPVT_WordPlace GetPrevWordPlace(const CPVT_WordPlace & place) const`* * :
-功能：返回段落中给定位置前一个单词的位置。

- **方法 `CPVT_WordPlace GetNextWordPlace(const CPVT_WordPlace & place) const`* * :
-功能：返回段落中给定位置后一个单词的位置。

- **方法 `void UpdateWordPlace(CPVT_WordPlace & place) const`* * :
-功能：更新给定单词位置。

- **方法 `CPVT_WordPlace SearchWordPlace(const CFX_PointF & point) const`* * :
-功能：根据给定点查找对应的单词位置。

- **方法 `CPVT_WordPlace SearchWordPlace(float fx, const CPVT_WordPlace & lineplace) const`* * :
-功能：根据给定的 x 坐标和行位置查找对应的单词位置。

- **方法 `CPVT_WordPlace SearchWordPlace(float fx, const CPVT_WordRange & range) const`* * :
-功能：根据给定的 x 坐标和单词范围查找对应的单词位置。

- **方法 `void SetPlace(const CPVT_WordPlace & place)`* * :
-功能：设置段落的起始位置。

- **方法 `void SetPlaceIndex(int32_t index)`* * :
-功能：设置段落的索引。

- **方法 `const CPVT_FloatRect & GetRect() const`* * :
-功能：返回段落的矩形区域。

- **方法 `void SetRect(const CPVT_FloatRect & rect)`* * :
-功能：设置段落的矩形区域。

- **方法 `int32_t GetLineArraySize() const`* * :
-功能：返回段落中行的数量。

- **方法 `const Line * GetLineFromArray(int32_t index) const`* * :
-功能：获取指定索引处的行。

- **方法 `int32_t GetWordArraySize() const`* * :
-功能：返回段落中单词的数量。

- **方法 `const CPVT_WordInfo * GetWordFromArray(int32_t index) const`* * :
-功能：获取指定索引处的单词信息。

- **方法 `void EraseWordsFrom(int32_t index)`* * :
-功能：从指定索引开始删除所有单词。

### 私有成员

- **方法 `CPVT_FloatRect RearrangeCharArray() const`* * :
-功能：重新排列字符数组，并返回新的矩形区域。

- **方法 `CPVT_FloatRect RearrangeTypeset()`* * :
-功能：重新排版段落，并返回新的矩形区域。

- **方法 `CPVT_FloatRect SplitLines(bool bTypeset, float fFontSize)`* * :
-功能：根据是否需要排版和给定的字体大小拆分行，并返回新的矩形区域。

- **方法 `CPVT_FloatRect OutputLines(const CPVT_FloatRect & rect) const`* * :
-功能：输出段落中的行到指定的矩形区域，并返回新的矩形区域。

- **方法 `void ClearLeftWords(int32_t nWordIndex)`* * :
-功能：清除给定索引左侧的所有单词。

- **方法 `void ClearRightWords(int32_t nWordIndex)`* * :
-功能：清除给定索引右侧的所有单词。

- **方法 `void ClearMidWords(int32_t nBeginIndex, int32_t nEndIndex)`* * :
-功能：清除给定索引范围内的所有单词。

### 成员变量

- `CPVT_WordPlace m_SecPlace`: 存储段落的起始位置。
- `CPVT_FloatRect m_Rect`: 存储段落的矩形区域。
- `std::vector<std::unique_ptr<Line>> m_LineArray`: 存储段落中的行数组。
- `std::vector<std::unique_ptr<CPVT_WordInfo>> m_WordArray`: 存储段落中的单词信息数组。
- `UnownedPtr<CPVT_VariableText > const m_pVT`: 指向 `CPVT_VariableText` 的未拥有指针。

### 总结

`CPVT_Section` 类提供了对 PDF 文档中可变文本注释段落的全面管理功能。它不仅支持段落中行和单词的添加、删除和查询，还提供了重新排列和调整段落布局的方法。通过 `Line` 内部类，可以方便地管理和操作每行的内容，确保段落在不同情况下的正确显示和排版。此外，`CPVT_Section` 还与 `CPVT_VariableText` 类紧密合作，利用其提供的字体映射和其他辅助功能，确保文本内容在不同环境下的正确呈现。// Copyright 2016 The PDFium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef CORE_FPDFDOC_CPVT_SECTION_H_
#define CORE_FPDFDOC_CPVT_SECTION_H_

#include <stdint.h>

#include <memory>
#include <vector>

#include "core/fpdfdoc/cpvt_floatrect.h"
#include "core/fpdfdoc/cpvt_lineinfo.h"
#include "core/fpdfdoc/cpvt_wordinfo.h"
#include "core/fpdfdoc/cpvt_wordrange.h"
#include "core/fxcrt/fx_coordinates.h"
#include "core/fxcrt/unowned_ptr.h"

class CPVT_VariableText;
struct CPVT_LineInfo;
struct CPVT_WordPlace;

class CPVT_Section final {
 public:
  class Line {
   public:
    explicit Line(const CPVT_LineInfo& lineinfo);
    ~Line();

    CPVT_WordPlace GetBeginWordPlace() const;
    CPVT_WordPlace GetEndWordPlace() const;
    CPVT_WordPlace GetPrevWordPlace(const CPVT_WordPlace& place) const;
    CPVT_WordPlace GetNextWordPlace(const CPVT_WordPlace& place) const;
    CPVT_WordPlace m_LinePlace;
    CPVT_LineInfo m_LineInfo;
  };

  explicit CPVT_Section(CPVT_VariableText* pVT);
  ~CPVT_Section();

  void ResetLinePlace();
  CPVT_WordPlace AddWord(const CPVT_WordPlace& place,
                         const CPVT_WordInfo& wordinfo);
  CPVT_WordPlace AddLine(const CPVT_LineInfo& lineinfo);
  void ClearWords(const CPVT_WordRange& PlaceRange);
  void ClearWord(const CPVT_WordPlace& place);
  CPVT_FloatRect Rearrange();
  CFX_SizeF GetSectionSize(float fFontSize);
  CPVT_WordPlace GetBeginWordPlace() const;
  CPVT_WordPlace GetEndWordPlace() const;
  CPVT_WordPlace GetPrevWordPlace(const CPVT_WordPlace& place) const;
  CPVT_WordPlace GetNextWordPlace(const CPVT_WordPlace& place) const;
  void UpdateWordPlace(CPVT_WordPlace& place) const;
  CPVT_WordPlace SearchWordPlace(const CFX_PointF& point) const;
  CPVT_WordPlace SearchWordPlace(float fx,
                                 const CPVT_WordPlace& lineplace) const;
  CPVT_WordPlace SearchWordPlace(float fx, const CPVT_WordRange& range) const;

  void SetPlace(const CPVT_WordPlace& place) { m_SecPlace = place; }
  void SetPlaceIndex(int32_t index) { m_SecPlace.nSecIndex = index; }
  const CPVT_FloatRect& GetRect() const { return m_Rect; }
  void SetRect(const CPVT_FloatRect& rect) { m_Rect = rect; }

  int32_t GetLineArraySize() const;
  const Line* GetLineFromArray(int32_t index) const;
  int32_t GetWordArraySize() const;
  const CPVT_WordInfo* GetWordFromArray(int32_t index) const;
  void EraseWordsFrom(int32_t index);

 private:
  CPVT_FloatRect RearrangeCharArray() const;
  CPVT_FloatRect RearrangeTypeset();
  CPVT_FloatRect SplitLines(bool bTypeset, float fFontSize);
  CPVT_FloatRect OutputLines(const CPVT_FloatRect& rect) const;

  void ClearLeftWords(int32_t nWordIndex);
  void ClearRightWords(int32_t nWordIndex);
  void ClearMidWords(int32_t nBeginIndex, int32_t nEndIndex);

  CPVT_WordPlace m_SecPlace;
  CPVT_FloatRect m_Rect;
  std::vector<std::unique_ptr<Line>> m_LineArray;
  std::vector<std::unique_ptr<CPVT_WordInfo>> m_WordArray;
  UnownedPtr<CPVT_VariableText> const m_pVT;
};

#endif  // CORE_FPDFDOC_CPVT_SECTION_H_
